/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package familytree.persistencia.dao.hibernate;

import familytree.persistencia.dao.NodoDAO;
import familytree.persistencia.pojos.Arbol;
import familytree.persistencia.pojos.Nodo;
import familytree.persistencia.pojos.Usuario;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Transaction;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions;


/**
 *
 * @author Jose Antonio
 */
public class HibernateNodoDAO extends HibernateGenericDAO<Nodo,String>
implements NodoDAO{

    
    
    public Nodo getNodoByIdNodo(String idNodo){
            Transaction tx = getSession().beginTransaction();
            List<Nodo> lista = null;
            try{
              Criterion criterion = Restrictions.eq("idNodo",idNodo);
              lista = findByCriteria(criterion);
              tx.commit();
             
             
            }
             catch(HibernateException e){
                tx.rollback();
            }
            if (lista == null)
                return null;
            else{
              return lista.get(0);
            }
    }
    

   
    /**
       Devuelve el nodo correspondiente al identificador de usuario que se le pasa como parametro
     * @param idUsuario Identificador del usuario del que queremos obtener su nodo correspondiente
     * @return Nodo Nodo correspondiente al identificador de usuario
     */
       public List<Nodo> getNodoByIdUsuario(Usuario usuario) {
            Criterion criterion = Restrictions.eq("usuario",usuario);
            List<Nodo> lista = findByCriteria(criterion);
            return lista;
    }
    /**
       Devuelve el nodo correspondiente al identificador de nodo que se le pasa como parametro
     * @param idNodo Identificador del nodo del que queremos obtener su nodo correspondiente
     * @return Nodo Nodo correspondiente al identificador de usuario
     */
       public void makeTransient(String idNodo) {
            Nodo n = super.findById(idNodo,false);
            Transaction tx = getSession().beginTransaction();
            try{
                super.makeTransient(n);
            }
            catch(HibernateException e){
                tx.rollback();
            }
              
      }
       
       public void updateNodo(Nodo n){
        Transaction tx = getSession().beginTransaction();
            try{
                
                Nodo aux = findById(n.getIdNodo(), false);
                
                aux.setFechaDefuncion(n.getFechaDefuncion());
                aux.setFechaNacimiento(n.getFechaNacimiento());
                aux.setImagen(n.getImagen());
                aux.setNombre(n.getNombre());
                aux.setPadres(n.getPadres());
                aux.setSegundoApellido(n.getSegundoApellido());
                aux.setPrimerApellido(n.getPrimerApellido());
                aux.setSexo(n.getSexo());
                aux.setUsuario(n.getUsuario());
                tx.commit();
            }
            catch(HibernateException e){
                tx.rollback();
            }
       }

    public List<Nodo> getNodosByNombre(String nombre, String idArbol) {
        Transaction tx = getSession().beginTransaction();
        List<Nodo> lista = new ArrayList<Nodo>();
        try{
            Arbol arbol = (Arbol)getSession().load(Arbol.class, idArbol);
            Criterion criterio1 = Restrictions.eq("arbol", arbol);
            Criterion criterio2 = Restrictions.like("nombre", "%"+nombre +"%");
            
            lista = findByCriteria(criterio1,criterio2);
        }
        catch(HibernateException he){
            
        }
        
        return lista;
    }

    public List<Nodo> getNodosByNombreYApellidos(String nombre, String primerApellido, String segundoApellido) {
        Transaction tx = getSession().beginTransaction();
        List<Nodo> lista = new ArrayList<Nodo>();
        try{
            Criterion criterio2 = Restrictions.like("nombre", "%"+nombre +"%");
            Criterion criterio3 = Restrictions.like("primerApellido", "%"+primerApellido+"%");
            Criterion criterio4 = Restrictions.like("segundoApellido", "%"+segundoApellido+"%");
            
            lista = findByCriteria(criterio2,criterio3,criterio4);
        }
        catch(HibernateException he){
            
        }
        
        return lista;
    }
    
    
}
